package com.gexin.common.utils;


import com.jfinal.kit.Ret;
import com.jfinal.weixin.sdk.kit.ParaMap;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.JsonUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Title: 小程序微信二维码生成接口
 */
public class WxaQrcodeApiExtends {
	public static String File_Path = System.getProperty("java.io.tmpdir") + "code";// 二维码的图片格式
	private static String createWxaQrcodeURLB = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
	// 文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
	private static String createWxaQrcodeURL = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=";

	private static String createWxaQrcodeXiaochengxuURL = "https://api.weixin.qq.com/wxa/getwxacode?access_token=";

	static {
		File f = new File(File_Path);
		if (!f.exists()) {
			f.mkdir();
		}
	}

	/**
	 * 获取小程序页面二维码
	 * 通过该接口，仅能生成已发布的小程序的二维码。 可以在开发者工具预览时生成开发版的带参二维码。 带参二维码只有 100000 个，请谨慎调用。
	 * width 默认430
	 *
	 * @param path不能为空，最大长度 128 字节
	 * @return ApiResult
	 */
	public InputStream createQrcode(String appid, String path) {
		return createQrcode(appid, path, 430);
	}

	/**
	 * 获取小程序页面二维码
	 * <p>
	 * 通过该接口，仅能生成已发布的小程序的二维码。 可以在开发者工具预览时生成开发版的带参二维码。 带参二维码只有 100000 个，请谨慎调用。
	 *
	 * @param path  不能为空，最大长度 128 字节
	 * @param width 默认430 二维码的宽度
	 * @return ApiResult
	 */
	public InputStream createQrcode(String appid, String path, int width) {
		String url = createWxaQrcodeURL + WexinAccessTokenKit.getAccessTokenToStr();
		ParaMap pm = ParaMap.create("path", path).put("width", String.valueOf(width));
		return HttpUtils.download(url, JsonUtils.toJson(pm.getData()));
	}

	/**
	 * @param appid
	 * @param path
	 * @param width
	 * @param is_hyaline 是否需要透明底色，为 true 时，生成透明底色的小程序码
	 *                   返回值
	 * @return
	 */
	public InputStream createQrcodeXiaochengxu(String appid, String path, int width, Boolean is_hyaline) {
		String url = createWxaQrcodeXiaochengxuURL + WexinAccessTokenKit.getAccessTokenToStr();
		Ret pm = Ret.create("path", path);
		pm.put("width", String.valueOf(width));
		pm.put("is_hyaline", is_hyaline);
		return HttpUtils.download(url, pm.toJson());
	}


	/**
	 * ：通过该接口生成的小程序码，永久有效，数量限制见文末说明，请谨慎使用。用户扫描该码进入小程序后，将直接进入 path 对应的页面。
	 *
	 * @param scene 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
	 * @param page  必须是已经发布的小程序存在的页面（否则报错），例如 "pages/index/index" ,根路径前不要填加'/',不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
	 * @param width 二维码的宽度
	 * @return
	 */
	public InputStream createQrcodeB(String appid, String scene, String page, int width) {
		String url = createWxaQrcodeURLB + WexinAccessTokenKit.getAccessTokenToStr();
		ParaMap pm = ParaMap.create("scene", scene).put("page", page).put("width", String.valueOf(width));
		return HttpUtils.download(url, JsonUtils.toJson(pm.getData()));
	}

	public InputStream createQrcodeB(String appid, String scene, int width) {
		String url = createWxaQrcodeURLB + WexinAccessTokenKit.getAccessTokenToStr();
		ParaMap pm = ParaMap.create("scene", scene).put("width", String.valueOf(width));
		return HttpUtils.download(url, JsonUtils.toJson(pm.getData()));
	}

	private void writeToLocal(String destination, InputStream input) throws IOException {
		int index;
		byte[] bytes = new byte[1024];
		FileOutputStream downloadFile = new FileOutputStream(destination);
		while ((index = input.read(bytes)) != -1) {
			downloadFile.write(bytes, 0, index);
			downloadFile.flush();
		}
		downloadFile.close();
		input.close();
	}

	/**
	 * 生成二维码 并且传递到七牛上面去
	 *
	 * @param scene 参数值
	 * @param width 宽度
	 * @return
	 */
	public String createQrcodeForQiniu(String appid, String page) {
		return createQrcodeForQiniu(appid, page, 430);
	}

	/**
	 * 生成二维码 并且传递到七牛上面去
	 *
	 * @param scene 参数值
	 * @param width 宽度
	 * @return
	 */
	public String createQrcodeForQiniu(String appid, String page, int width) {
		InputStream input = createQrcode(appid, page, width);
		String code = IdGenerateUtils.getId();
		String file_name = File_Path + File.separator + code + ".jpg";
		int index;
		byte[] bytes = new byte[1024];
		try {
			FileOutputStream downloadFile = new FileOutputStream(file_name);
			while ((index = input.read(bytes)) != -1) {
				downloadFile.write(bytes, 0, index);
				downloadFile.flush();
			}
			downloadFile.close();
			input.close();
			return QiNiuUtil.upload(file_name, code + ".jpg");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 生成小程码 并且传递到七牛上面去
	 *
	 * @param scene 参数值
	 * @param width 宽度
	 * @param is_hyaline 是否透明
	 * @return
	 */
	public String createQrcodeXiaoChengXuForQiniu(String appid, String page, int width, Boolean is_hyaline) {
		InputStream input = createQrcodeXiaochengxu(appid, page, width, is_hyaline);
		String code = IdGenerateUtils.getId();
		String file_name = File_Path + File.separator + code + ".jpg";
		int index;
		byte[] bytes = new byte[1024];
		try {
			FileOutputStream downloadFile = new FileOutputStream(file_name);
			while ((index = input.read(bytes)) != -1) {
				downloadFile.write(bytes, 0, index);
				downloadFile.flush();
			}
			downloadFile.close();
			input.close();
			return QiNiuUtil.upload(file_name, code + ".jpg");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}


	/**
	 * 生成二维码 并且传递到七牛上面去
	 *
	 * @param scene 参数值
	 * @param width 宽度
	 * @return
	 */
	public String createQrcodeBForQiniu(String appid, String scene, String page) {
		return createQrcodeBForQiniu(appid, scene, page, 430);
	}

	/**
	 * 生成二维码 并且传递到七牛上面去
	 *
	 * @param scene 参数值
	 * @param width 宽度
	 * @return
	 */
	public String createQrcodeBForQiniu(String appid, String scene, String page, int width) {
		InputStream input = createQrcodeB(appid, scene, page, width);
		String code = IdGenerateUtils.getId();
		String file_name = File_Path + File.separator + code + ".jpg";
		int index;
		byte[] bytes = new byte[1024];
		try {
			FileOutputStream downloadFile = new FileOutputStream(file_name);
			while ((index = input.read(bytes)) != -1) {
				downloadFile.write(bytes, 0, index);
				downloadFile.flush();
			}
			downloadFile.close();
			input.close();
			return QiNiuUtil.upload(file_name, code + ".jpg");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}
}
